package x.x.x;

import java.lang.reflect.Field;

/**
 * 将一个实体Entry转换成对应的插入Insert语句
 * @author admin
 * @time 2017年3月8日
 *
 */
public class EntryToInsertSQL {
    private static String parameterWithSQL = null;
    private static Field[] fields = null;
    
    /**
     * 私有构造,禁止新建
     */
    private EntryToInsertSQL(){
        
    }
    
    /**
     * 给出一个实体,将实体转换成对应的带有?符号的Insert语句
     * 类似:insert into tabla1 (field1,field2,field3) values (?,?,?)
     * 存在的问题:不知道field1,field2,field3的顺序,无法拼接
     * 注:字段的顺序存放在fields字段数组中
     * 问题1:entry.getClass().getDeclaredFields();多次得到的结果顺序是否一致? ==>答:API显示此方法获得数据无顺序
     * 
     * 解决方案:将带有?的SQL语句,字段顺序,完整的SQL语句等做成类变量,通过调用一个方法传入entry对象,分别获得这几个值
     * 
     *@author hanxy17
     * 如修改方法体请自行修改作者信息
     * 当前作者只对自己编写内容负责
     * 2017年3月9日上午10:05:48
     * @param entry
     * @return
     */
    private static <T> void createSQL(T entry){
        //用于存放返回结果
        StringBuffer result = new StringBuffer();
        //获取类名,由于类名和表名是一致的,可以直接使用
        String tableName = entry.getClass().getSimpleName();
        //获得实体对象中所有声明的属性字段(包含实体类本身声明的public,private,protected;但是不包含父类的)
        Field[] fields = entry.getClass().getDeclaredFields();
        //初步拼接一个SQL语句
        result.append("insert into ").append(tableName).append(" (");//insert into table1 (
        //获得字段个数,用于遍历
        int length = fields.length;
        //临时存放参数拼接使用的?符号
        StringBuffer parameter = new StringBuffer();
        for (int i = 0; i < length; i++) {
            String field = fields[i].getName();
            result.append(field).append(",");//拼接内容field1,field2,field3,
            parameter.append("?,");//拼接结果?,?,?,
            
        }
        result.deleteCharAt(result.length()-1);//去掉末尾的,
        parameter.deleteCharAt(parameter.length()-1);//去掉末尾的,
        /*
         * 拼接结果
         * insert into tabla1 (field1,field2,field3  ==>result,初始值+循环添加之后的值
         * ) values (  ==>第一个拼接的内容
         * ?,?,?  ==>parameter,第二个拼接的内容
         * )  ==>第三个拼接的值
         * 结果 insert into tabla1 (field1,field2,field3) values (?,?,?)
         */
        StringBuffer parameterSQL = new StringBuffer(result).append(") values (").append(parameter).append(")");
        
        EntryToInsertSQL.fields = fields;
        EntryToInsertSQL.parameterWithSQL =  parameterSQL.toString();
    }
    
    
    public static <T> EntryToInsertSQL init(T entry){
        EntryToInsertSQL eti = new EntryToInsertSQL();
        createSQL(entry);
        return eti;
    }

    public String getParameterWithSQL() {
        return EntryToInsertSQL.parameterWithSQL;
    }

    public Field[] getFields() {
        return EntryToInsertSQL.fields;
    }
    
    
    public static void main(String[] args) {
        EntryToInsertSQL eti = EntryToInsertSQL.init(new TestEntry());
        System.err.println(eti.getParameterWithSQL());
        for (Field field : eti.getFields()) {
            System.err.println(field.getName());
        }
    }
    
}

class TestEntry{
    private String name;
    private Long id;
    
    public String getName() {
        return name;
    }
    public Long getId() {
        return id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setId(Long id) {
        this.id = id;
    }
    
}
